package net.edu_soft.ec.common.util;

import net.edu_soft.ec.asset.constant.CloudFileUrlConstant;
import net.edu_soft.ec.asset.pojo.CloudFile;
import net.edu_soft.ec.common.exception.OperationException;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.multipart.MultipartFile;

import javax.imageio.ImageIO;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.awt.*;
import java.awt.image.BufferedImage;
import java.io.*;
import java.util.UUID;

public class FileUtils {


    /**
     * 文件对象，存储路径：
     * @param mainFile 储存对象
     * @param url 存储路径
     * @param fileName 存储名称
     * @return
     */
    public static int getImgUrl(MultipartFile mainFile, String url, String fileName){
        if (mainFile==null){
            return 0;
        }
        //文件名称定义方式    作用+随机码+产品.jpg  fileName 列如：main_sdfasf_24.jpg
        //文件夹定义    文件前缀+自定义   url  列如：usr/tomcat/webspde/hjy/+factory/main
//        File dir=new File(url,fileName);
//        //创建文件夹的名字
//        if(!dir.exists()){
//            System.out.println("文件前缀 "+url+"不存在 现在创建一个");
//            dir.mkdirs();
//        }
//        try {
//            mainFile.transferTo(dir);
//        }catch (IOException e){
//            System.out.println("捕获异常："+e);
//        }

        File file = new File(url);
        if (!file.exists()) {
            try {
                // 按照指定的路径创建文件夹
                file.setWritable(true, false);
                file.mkdirs();
            } catch (Exception e) {
            }
        }
        File dir = new File(url+"/"+fileName);
        if (!dir.exists()) {
            try {
                // 在指定的文件夹中创建文件
                //dir.createNewFile();
                mainFile.transferTo(dir);

            } catch (Exception e) {
                System.out.println("捕获异常："+e);
            }
        }


        return 1;
    }


    /***
     * 文件下载
     * @param request
     * @param response
     * @param name 文件名 如：f8741d8872cc42baaea9ab65474e8e5e.png
     * @return
     */
    public static Object downloadFile(HttpServletRequest request, HttpServletResponse response, String name) {
        PuingUtil.isEmpty("文件下载，文件名不能为空！",name);




        if (name != null) {
            // 系统文件的磁盘路径
            // = "D:\\Code space\\Java\\Test\\file\\puing";
            //String realPath = "http://localhost:8088/static";
            String realPath = CloudFileUrlConstant.SYS_FILE_URL;//获得系统存放的总目录
            File file = new File(realPath, name);
            String[] strs = name.split("\\\\");
            if (file.exists()) {
                response.setContentType("application/force-download");// 设置强制下载不打开
                response.addHeader("Content-Disposition", "attachment;fileName="+strs[strs.length-1]);// 设置文件名
                byte[] buffer = new byte[1024];
                FileInputStream fis = null;
                BufferedInputStream bis = null;
                try {
                    fis = new FileInputStream(file);
                    bis = new BufferedInputStream(fis);
                    OutputStream os = response.getOutputStream();
                    int i = bis.read(buffer);
                    while (i != -1) {
                        os.write(buffer, 0, i);
                        i = bis.read(buffer);
                    }
                    System.out.println("success");
                } catch (Exception e) {
                    e.printStackTrace();
                } finally {
                    if (bis != null) {
                        try {
                            bis.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                    if (fis != null) {
                        try {
                            fis.close();
                        } catch (IOException e) {
                            e.printStackTrace();
                        }
                    }
                }
            }
        }
        return null;
    }


    /***
     * 上传文件
     * @param file
     * @return
     */
    public static CloudFile upload(@RequestParam("file") MultipartFile file) {
        try {
            if (file.isEmpty()) {
                return null;
            }
            String fileName = file.getOriginalFilename();// 获取文件名
//            System.out.println("文件名：" + fileName);

            String folderName = CheckFileType.getFolderName(file.getInputStream());
            if(folderName==null){//空的上传或者是无效的文件
                throw new OperationException("空的上传或者是无效的文件");
            }
            // 获取文件的后缀名
            String suffixName = fileName.substring(fileName.lastIndexOf("."));
//            System.out.println("文件后缀：" + suffixName);
            // 获得文件的大小
            long fileSize = file.getSize();
//            System.out.println("文件大小：" + fileSize);
            String randomFileName = PuingUtil.getYearMonth();//年月
            String fName = PuingUtil.getRandomIdByUtil();//随机名
            // 设置文件存储路径
            String filePath =CloudFileUrlConstant.SYS_FILE_URL ;
            String path = filePath +fName+ suffixName;

            //String relativePath = folderName+"\\"+randomFileName+"\\"+fName+suffixName;//得到所属类型的文件夹目录 Windows
            String relativePath = folderName+"/"+randomFileName+"/"+fName+suffixName;//得到所属类型的文件夹目录  Linux系统

//            System.out.println("===>   "+filePath+relativePath);

            File dest = new File(filePath+relativePath);//系统硬盘目录+资源目录
            // 检测是否存在目录
            if (!dest.getParentFile().exists()) {
                dest.getParentFile().mkdirs();// 新建文件夹
            }
            file.transferTo(dest);// 文件写入

            //生成随机文件名
            //String randomFileName = PUINGUtils.getRandomIdByUtil();
            //创建文件夹

            //成功则保存文件信息
            CloudFile cloudFile = new CloudFile();
            //cloudFile.setAffId(1);//归属id
            //cloudFile.setCloudFileId(1);//文件id
            cloudFile.setFileTypeId(1);//文件类型----为第二阶段吧
            cloudFile.setName(fName+suffixName);//文件名+后缀
            cloudFile.setSize(fileSize);//文件大小
            cloudFile.setSortOrder(1);//文件排序次序
            cloudFile.setStatus(0);//文件状态
            cloudFile.setUrl(relativePath);//文件资源路径，具体系统硬盘地址
            return cloudFile;
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return null;
    }



    /**
     * 删除文件
     * @param fileName
     * @return
     */

    public static boolean delete (String fileName){
        System.out.println("当前删除的路径："+fileName);
        try{
            File sourceFile = new File(fileName);
            if(sourceFile.isDirectory()){
                for (File listFile : sourceFile.listFiles()) {
                    delete(listFile.getAbsolutePath());
                }
            }
            return sourceFile.delete();
        }catch(Exception e){
            e.printStackTrace();
        }
        return false;
    }

    /**
     * 压缩图片按照指定的宽高压缩原图
     * @param file
     * @param destWidth
     * @param destHeight
     * @param outputDir
     */
    public static void thumbnail(MultipartFile file,int destWidth,int destHeight,String outputDir){
        System.out.println("图片压缩开始");
        long startTime = System.currentTimeMillis();
        //得到上传时的原文件名
        String originalFilename = file.getOriginalFilename();
        //获取文件后缀名
        String suffixName = originalFilename.substring(originalFilename.lastIndexOf("."));
        //获取文件格式
        String ext = originalFilename.substring(originalFilename.lastIndexOf(".") + 1);
        //获取uuid作为文件名
        String name = UUID.randomUUID().toString().replaceAll("-", "");
        String saveName = name + suffixName;
        //存储目录
        String picDir = "";//UploadPathUtils.getPicUploadDir(destWidth,destHeight);
        //图片存储全路径
        String outputPath = picDir + '/' + saveName;
        OutputStream fos = null;
        try {
            //读取源图
            BufferedImage BI = ImageIO.read(file.getInputStream());
            double srcWidth = BI.getWidth(); // 源图宽度
            double srcHeight = BI.getHeight(); // 源图高度
            if ((int)srcWidth >= destWidth && (int)srcHeight >= destHeight) {

                fos = new FileOutputStream(outputPath);
                Image image = BI.getScaledInstance(destWidth, destHeight, Image.SCALE_SMOOTH);

                BufferedImage tag = new BufferedImage(destWidth, destHeight,BufferedImage.TYPE_INT_RGB);
                Graphics g = tag.getGraphics();
                g.setColor(Color.RED);
                g.drawImage(image, 0, 0, null); //绘制处理后的图
                g.dispose();
                ImageIO.write(tag,ext,fos);
                System.out.println("图片压缩并存储结束");
                long endTime = System.currentTimeMillis();
                System.out.println("图片压缩共计耗时：" +(endTime-startTime)+"毫秒" );
            }
        } catch (FileNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }finally{
            if(fos != null){
                try {
                    fos.close();
                } catch (IOException e) {
                    // TODO Auto-generated catch block
                    e.printStackTrace();
                }
            }
        }
    }

}
